package file

import (
	"bytes"
	"compress/gzip"
	"io"
	"os"
)

/*
*
*压缩bytes内容
*@content:需要压缩的内容
*@path:压缩后的文件路径 xxxx/xxxx.gz
*@fileName:压缩后的文件名
 */
func Gzip(content []byte, path string) error {
	gzFile, err := os.Create(path)
	if err != nil {
		return err
	}
	defer gzFile.Close()
	gzipWriter := gzip.NewWriter(gzFile)
	//获取path最后一个/的位置
	index := bytes.LastIndex([]byte(path), []byte(string(os.PathSeparator)))
	//获取path最后一个/后面的内容
	fileName := string([]byte(path)[index+1:])
	defer gzipWriter.Close()
	gzipWriter.Name = fileName
	_, err = gzipWriter.Write(content)
	if err != nil {
		return err
	}
	return nil
}

func GzipStr(content string, path string) {
	err := Gzip([]byte(content), path)
	if err != nil {
		panic(err)
	}
}

func GzipFile(src string, dst string) {
	//读取文件内容
	f, err := os.Open(src)
	if err != nil {
		panic(err)
	}
	defer f.Close()
	buf := make([]byte, 1024)
	var content []byte
	for {
		n, _ := f.Read(buf)
		if 0 == n {
			break
		}
		content = append(content, buf[:n]...)
	}
	//压缩文件
	err = Gzip(content, dst)
	if err != nil {
		panic(err)
	}
}

/*
*
*解压
*@path:压缩文件路径
*@content:解压后的内容
 */
func UnGzip(path string) (content []byte, err error) {
	gzipFile, err := os.Open(path)
	if err != nil {
		return
	}
	defer gzipFile.Close()
	gzipReader, err := gzip.NewReader(gzipFile)
	if err != nil {
		return
	}
	defer gzipReader.Close()
	var buf bytes.Buffer
	_, err = io.Copy(&buf, gzipReader)
	if err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}

// 将压缩文件解压到指定目录
func UnGzipPath(stc string, dst string) {
	content, err := UnGzip(stc)
	if err != nil {
		panic(err)
	}
	s := string(content)
	//写入解压后的内容
	f, err := os.Create(dst)
	if err != nil {
		panic(err)
	}
	defer f.Close()
	_, err = f.WriteString(s)
	if err != nil {
		panic(err)
	}
}
